
public class RemoveElement {
/*
删除元素

给你一个数组 nums 和一个值 val，你需要 原地 移除所有数值等于 val 的元素，并返回移除后数组的新长度。

不要使用额外的数组空间，你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
*/

    public static void main(String[] args) {

    }

    // 我的想法：该方法属于暴力解法
    public int myRemove(int[] nums, int val){
        int len = nums.length;
        for(int i = 0; i < len;){
            if(nums[i] != val){
                i++;
                continue;
            }
            for(int c = i+1; c < len; c++){
                nums[c-1] = nums[c];
            }
            len -= 1;
        }
        return len;
    }


    // 双指针解法（相当于报听写，快指针遍历一遍数组，告诉你哪些元素要留下来，慢指针从头到尾写一遍就好了）
    public int twoPointRemove(int[] nums, int val){
        int slowIndex = 0;
        for(int fastIndex = 0; fastIndex < nums.length; fastIndex++){
            // 这个元素是我要要的，记下来
            if(nums[fastIndex] != val){
                nums[slowIndex] = nums[fastIndex];
                // 记下来后记得往后移
                slowIndex++;
            }
        }
        return slowIndex;
    }
}
